<?php
/*
 * 模拟web端口登入->抓取指定页面的数据
 * 没有封装CURL
 * 获取保存会话
 * 拿到钥匙(验证码)
 * 登入请求
 * 重定向跳转
 * 匹配数据
 * */
// 引入百度AI
require_once('./Orm.php');

/*
 * 获取会话并保存
 * return   bool|string
 * */
function getCookie()
{
    $cookie_file = dirname(__FILE__) . '/cookie.txt';//保存cookie的文件
    $login_url   = "https://www.cndns.com/members/signin.aspx";//登陆页面网址
    $cookie_curl = curl_init();
    $timeout     = 5;
    curl_setopt($cookie_curl, CURLOPT_URL, $login_url);
    curl_setopt($cookie_curl, CURLOPT_RETURNTRANSFER, 1);//将curl_exec()获取的信息以字符串返回，而不是直接输出。
    curl_setopt($cookie_curl, CURLOPT_CONNECTTIMEOUT, $timeout);//在尝试连接时等待的秒数。设置为0，则无限等待
    curl_setopt($cookie_curl, CURLOPT_COOKIEJAR,$cookie_file); //获取COOKIE并存储,在执行curl_close连接介绍，保存获取的cookie的文件
    curl_setopt($cookie_curl,CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($cookie_curl,CURLOPT_SSL_VERIFYHOST, false);
    curl_exec($cookie_curl);
    curl_close($cookie_curl);
}

/*
 * 获取登入需要的验证码
 * 验证码图片生成
 * 验证码图片保存
 * 百度AI图片解析得到验证码
 * return array|atring
 * */
function getCode()
{
    /*
     * web端打开登入页 选择密码方式登入 打开F12查看network 点击刷新验证码后查看请求报文路径为https://www.cndns.com/common/GenerateCheckCode.aspx
     * 请求方式为get请求，且请求参数分别为t、temp两个参数(两个接口没什么用)
     * */
    $cookie_file = dirname(__FILE__) . '/cookie.txt';//保存cookie的文件
    $codeUrl     = "https://www.cndns.com/common/GenerateCheckCode.aspx?t=111dasdsa&temp=1dad";//获取图片验证码url
    $verify_code_referer = "https://www.cndns.com/index.aspx?b=mchl&bd_vid=11189890379026177026";//登陆页面url
    $verify_curl         = curl_init();
    curl_setopt($verify_curl, CURLOPT_URL, $codeUrl);
    curl_setopt($verify_curl, CURLOPT_COOKIEFILE, $cookie_file);//第一步获取的cookie文件
    curl_setopt($verify_curl, CURLOPT_HEADER, 0);//启用时会将头文件的信息作为数据流输出。
    curl_setopt($verify_curl, CURLOPT_REFERER, $verify_code_referer);//在HTTP请求头中"Referer: "的内容，访问来源
    curl_setopt($verify_curl, CURLOPT_RETURNTRANSFER, 1);//将curl_exec()获取的信息以字符串返回，而不是直接输出。
    curl_setopt($verify_curl,CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($verify_curl,CURLOPT_SSL_VERIFYHOST, false);
    $file = curl_exec($verify_curl);
    curl_close($verify_curl);
    /*
     * 保存抓取的code图片
     * */
    $fullpath = "D:/".uniqid().'.png';
    $resource = fopen($fullpath, 'a');
    fwrite($resource, $file);
    fclose($resource);

    // 打开验证码图片
    if($fp = fopen($fullpath,"rb", 0))
    {
        // 开始读取
        $gambar = fread($fp,filesize($fullpath));
        fclose($fp);

        // 转换编码格式
        $image = chunk_split(base64_encode($gambar));
        $bodys = array(
            'image' => $image
        );

        // 百度AI获取会话
        $Orm = new Orm();
        $info = $Orm->getOrmToken();
        if (!$info['code']) return $info;
        // $token = $info['data']['access_token'];
        $token = '24.13a31e48bdbdc3cce320f8817d90ec0f.2592000.1649436301.282335-25737180';
        // 发起请求
        $url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic?access_token='.$token;
        $code = $Orm->request_post($url, $bodys);
        $codeArr = json_decode($code,true);
        if (isset($codeArr['error_code'])) return ['code'=>0,'data'=>['error_code'=>$codeArr['error_code']],'msg'=>$codeArr['error_msg']];
        if (!isset($codeArr['words_result'][0]['words'])) return ['code'=>0,'data'=>[],'msg'=>'验证码获取失败'];
        // 保存解析完毕的验证码(精度偶尔有点问题,杂点没去掉)
        $loginCode = $str = str_replace(PHP_EOL, '', $codeArr['words_result'][0]['words']);
        return ['code'=>1,'data'=>$loginCode,'msg'=>'验证码获取成功'];
    }else{
        return ['code'=>0,'data'=>[],'msg'=>'验证码获取失败'];
    }
}

/*
 * 模拟登入
 * web 端口 查看network 报文请求包含以下字段 密码部分为32位MD5加密
 * 用户名unme: 1365174252
 * 密码upss: 9d17021fd7c116b7761fcdb28f3441c6
 * 访问模块？module: login
 * 登入方式1=>手机验证码 2密码登入 usertype: 2
 * 手机号验证码phonecode:
 * 屏幕宽高度:screenX: 1366
 * 屏幕宽高度:screenY: 768
 * 两种登入方式均为空rtn:
 * 自动登入?isAuto: 0
 * 这个不清楚langsite:
 * 验证码: codes:
 * return string
 * */
function webLogin($loginCode)
{
    // 登陆地址
    $submit_url = "https://www.cndns.com/Ajax/Login.ashx";
    // 模拟登入的用户名
    $unme = "13651742952@mail.top";
    // 模拟登入的密码 密码是MD5(32)位
    $upass = md5("SZk123456@");
    // 登入请求参数
    $post_data = array (
        'unme'=>$unme,
        'upss'=>$upass,
        'module'=>'login',
        'usertype'=>'2',
        'phonecode'=>'',
        'screenX'=>'1366',
        'screenY'=>'768',
        'rtn'=>'',
        'isAuto'=>0,
        'langsite'=>'',
        'codes'=>$loginCode
    );
    // 模拟的请求头部信息
    $header = array(
        'Accept: application/json, text/javascript, */*; q=0.01',
        'Upgrade-Insecure-Requests: 1',
        'Content-Type: application/x-www-form-urlencoded;charset=UTF-8',
        'Accept-Encoding: gzip, deflate,br',
        'Accept-Language: zh-CN,zh;q=0.9',
        'Content-Length:'.strlen(http_build_query($post_data))
    );
    // 先前保存的会话
    $cookie_file    = dirname(__FILE__) . '/cookie.txt';
    // 请求来源
    $submit_referer = "https://www.cndns.com/members/signin.aspx";
    // 初始化curl模块
    $submit_curl    = curl_init();
    // 登录地址
    curl_setopt($submit_curl, CURLOPT_URL, $submit_url);
    // 是否显示头信息
    curl_setopt($submit_curl, CURLOPT_HEADER, 0);
    curl_setopt($submit_curl, CURLOPT_RETURNTRANSFER, 1);//将curl_exec()获取的信息以字符串返回，而不是直接输出。
    // 设置Cookie信息
    curl_setopt($submit_curl, CURLOPT_COOKIEFILE, $cookie_file);
    // 请求来源
    curl_setopt($submit_curl, CURLOPT_REFERER, $submit_referer);
    // 模拟浏览器请求
    curl_setopt($submit_curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36");
    // 设置header头部信息
    curl_setopt($submit_curl, CURLOPT_HTTPHEADER,$header);
    // post方式提交
    curl_setopt($submit_curl, CURLOPT_POST, 1);
    // 请求参数
    curl_setopt($submit_curl, CURLOPT_POSTFIELDS, http_build_query($post_data));
    // 忽略cURL验证SSL证书
    curl_setopt($submit_curl,CURLOPT_SSL_VERIFYPEER, false);
    // 忽略主机验证
    curl_setopt($submit_curl,CURLOPT_SSL_VERIFYHOST, false);
    //执行
    $contents = curl_exec($submit_curl);
    //关闭cURL资源，并且释放系统资源
    curl_close($submit_curl);
    return $contents;
}

/*
 * 抓取指定数据
 * */
function getUserMoney($findUrl)
{
    // 先前保存的会话
    $cookie_file    = dirname(__FILE__) . '/cookie.txt';
    // 模拟的请求头部信息
    $header = array(
        'Accept: application/json, text/javascript, */*; q=0.01',
        'Upgrade-Insecure-Requests: 1',
        'Content-Type: application/x-www-form-urlencoded;charset=UTF-8',
        'Accept-Encoding: gzip, deflate,br',
        'Accept-Language: zh-CN,zh;q=0.9',
    );
    // 初始化curl模块
    $submit_curl    = curl_init();
    // 登录地址
    curl_setopt($submit_curl, CURLOPT_URL, $findUrl);
    // 是否显示头信息
    curl_setopt($submit_curl, CURLOPT_HEADER, 0);
    curl_setopt($submit_curl, CURLOPT_NOBODY, false);
    curl_setopt($submit_curl, CURLOPT_RETURNTRANSFER, 1);//将curl_exec()获取的信息以字符串返回，而不是直接输出。
    // 设置Cookie信息
    curl_setopt($submit_curl, CURLOPT_COOKIEFILE, $cookie_file);
    // 请求来源
    curl_setopt($submit_curl, CURLOPT_REFERER, 'https://www.cndns.com/');
    // 模拟浏览器请求
    curl_setopt($submit_curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36");
    // 设置header头部信息
    curl_setopt($submit_curl, CURLOPT_HTTPHEADER,$header);
    // 忽略cURL验证SSL证书
    curl_setopt($submit_curl,CURLOPT_SSL_VERIFYPEER, false);
    // 忽略主机验证
    curl_setopt($submit_curl,CURLOPT_SSL_VERIFYHOST, false);
    // 防止抓到的包是乱码
    curl_setopt($submit_curl,CURLOPT_ENCODING, 'gzip');
    // 重定向地址跟踪
    curl_setopt($submit_curl,CURLOPT_FOLLOWLOCATION, 1);
    //执行
    $contents = curl_exec($submit_curl);
    //关闭cURL资源，并且释放系统资源
    curl_close($submit_curl);
    return $contents;
}

// 获取登入会话
getCookie();
// 获取验证码
$Code = getCode();
if (!$Code['code']){
   die(json_encode(['code' => 0, 'data' => [], 'msg' => '获取验证码错误'],JSON_UNESCAPED_UNICODE));
}
// 执行登入
$contents = webLogin($Code['data']);
$result = json_decode($contents,true);
/*
 * 根据接口返回值来判断 目前res为10000时代表登入成功 So 接下来可以跳转至userHome后 在跳转至指定页面后抓取金额
 * */
if ($result['res']!=='10000'){
    die(json_encode(['code'=>0,'data'=>[],'msg'=>$result['message']],JSON_UNESCAPED_UNICODE));
}
$htmlDetails = getUserMoney('https://www.chengmi.cn/userpanel');
if (!$htmlDetails) return ['code'=>0,'data'=>[],'msg'=>'服务错误'];
// 按照指定标签及属性进行匹配
$regex = '/<td height="36" align="center" class="hsac" style="font-size: 18px;">([^<]*)<\/td>/i';
if(!preg_match_all($regex,$htmlDetails,$matches)){
    die('未匹配');
}
// 截取指定字符串
if (!is_array($matches)) die('未匹配');
echo "账户余额为: ".$matches[1][0];